CM3D2 Converter.compat
1# -*- coding: utf-8 -*- 2import bpy 3import bpy_extras 4import re 5import struct 6import os 7import mathutils 8import traceback 9import numpy as np 10from typing import Any, Optional 11 12 13# LEGAY: version less than 2.80 14IS_LEGACY = not hasattr(bpy.app, 'version') or bpy.app.version < (2, 80) 15 16class BlRegister(): 17 idnames = set() 18 classes = [] 19 20 def __init__(self, *args, **kwargs): 21 self.make_annotation = kwargs.get('make_annotation', True) 22 self.use_bl_attr = kwargs.get('use_bl_attr', True) 23 self.only_legacy = kwargs.get('only_legacy', False) 24 self.only_latest = kwargs.get('only_latest', False) 25 26 def __call__(self, cls): 27 28 if hasattr(cls, 'bl_idname'): 29 bl_idname = cls.bl_idname 30 else: 31 if self.use_bl_attr: 32 bl_ctx = getattr(cls, 'bl_context', '') 33 bl_idname = f'{cls.bl_space_type}{cls.bl_region_type}{bl_ctx}{cls.bl_label}' 34 else: 35 bl_idname = cls.__qualname__ 36 37 if self.only_legacy: 38 if IS_LEGACY: 39 BlRegister.add(bl_idname, cls) 40 elif self.only_latest: 41 if IS_LEGACY is False: 42 BlRegister.add(bl_idname, cls) 43 else: 44 BlRegister.add(bl_idname, cls) 45 46 if self.make_annotation: 47 cls = make_annotations(cls) 48 49 if not IS_LEGACY and bpy.app.version >= (2, 93): 50 cls = make_prop_annotations(cls) 51 52 return cls 53 54 @classmethod 55 def add(cls: type, bl_idname: str, op_class: type) -> None: 56 if bl_idname in cls.idnames: 57 raise RuntimeError("Duplicate bl_idname: %s" % bl_idname) 58 59 cls.idnames.add(bl_idname) 60 cls.classes.append(op_class) 61 62 @classmethod 63 def register(cls): 64 for cls1 in cls.classes: 65 bpy.utils.register_class(cls1) 66 67 @classmethod 68 def unregister(cls): 69 for cls1 in reversed(cls.classes): 70 bpy.utils.unregister_class(cls1) 71 72 @classmethod 73 def cleanup(cls): 74 cls.classes.clear() 75 cls.idnames.clear() 76 77def make_prop_annotations(cls): 78 if IS_LEGACY: 79 return cls 80 81 prop_type = bpy.props._PropertyDeferred 82 annotations = cls.__annotations__ if hasattr(cls, "__annotations__") else dict() 83 84 for prop_name in dir(cls): 85 prop = getattr(cls, prop_name) 86 if type(prop) != prop_type: 87 continue 88 annotations[prop_name] = prop 89 90 setattr(cls, "__annotations__", annotations) 91 #print(cls.__annotations__) 92 return cls 93 94 95def make_annotations(cls): 96 if IS_LEGACY: 97 return cls 98 99 cls_props = {} 100 for k, v in cls.__dict__.items(): 101 if isinstance(v, tuple): 102 cls_props[k] = v 103 104 annos = cls.__dict__.get('__annotations__') # type: dict[str, type] 105 if annos is None: 106 annos = {} 107 setattr(cls, '__annotations__', annos) 108 109 for k, v in cls_props.items(): 110 annos[k] = v 111 delattr(cls, k) 112 113 # 親クラスを辿ってアノテーションを生成 114 for bc in cls.__bases__: 115 # bpyのタイプやbuiltinsの場合はスキップ 116 if bc.__module__ in ['bpy_types', 'builtins']: 117 continue 118 make_annotations(bc) 119 120 return cls 121 122 123def layout_split(layout, factor=0.0, align=False): 124 if IS_LEGACY: 125 return layout.split(percentage=factor, align=align) 126 127 return layout.split(factor=factor, align=align) 128 129 130def get_active(): 131 if IS_LEGACY: 132 return bpy.context.scene.objects.active 133 134 return bpy.context.view_layer.objects.active 135 136def get_active(context): 137 if IS_LEGACY: 138 return context.scene.objects.active 139 140 return context.view_layer.objects.active 141 142 143def set_active(context, obj): 144 if IS_LEGACY: 145 context.scene.objects.active = obj 146 else: 147 context.view_layer.objects.active = obj 148 149 150def get_active_uv(me): 151 if IS_LEGACY: 152 uvs = me.uv_textures 153 else: 154 uvs = me.uv_layers 155 return uvs.active 156 157 158def set_display_type(ob, disp_type): 159 if IS_LEGACY: 160 ob.draw_type = disp_type 161 else: 162 ob.display_type = disp_type 163 164 165def get_select(obj: bpy.types.Object) -> bool: 166 if IS_LEGACY: 167 return obj.select 168 169 return obj.select_get() 170 171 172def set_select(obj: bpy.types.Object, select: bool) -> None: 173 if IS_LEGACY: 174 obj.select = select 175 else: 176 obj.select_set(select) 177 178 179def is_select(*args) -> bool: 180 """すべてが選択状態であるかを判定する.""" 181 if IS_LEGACY: 182 return all(arg.select for arg in args) 183 184 return all(arg.select_get() for arg in args) 185 186 187def get_hide(obj: bpy.types.Object) -> bool: 188 if IS_LEGACY: 189 return obj.hide 190 191 return obj.hide_viewport 192 193 194def set_hide(obj: bpy.types.Object, hide: bool): 195 if IS_LEGACY: 196 obj.hide = hide 197 198 else: 199 obj.hide_viewport = hide 200 201 202def link(scene: bpy.types.Scene, obj: bpy.types.Object): 203 if IS_LEGACY: 204 scene.objects.link(obj) 205 elif bpy.context.collection: 206 bpy.context.collection.objects.link(obj) 207 else: 208 scene.collection.objects.link(obj) 209 210 211def unlink(scene: bpy.types.Scene, obj: bpy.types.Object): 212 if IS_LEGACY: 213 scene.objects.unlink(obj) 214 else: 215 for collection in obj.users_collection: 216 collection.objects.unlink(obj) 217 218 219def get_cursor_loc(context): 220 if IS_LEGACY: 221 return context.space_data.cursor_location 222 else: 223 return context.scene.cursor.location 224 225 226def get_lights(blend_data): 227 if IS_LEGACY: 228 return blend_data.iamps 229 else: 230 return blend_data.lights 231 232 233def mul(x, y): 234 if IS_LEGACY: 235 return x * y 236 237 return x @ y 238 239 240def mul3(x, y, z): 241 if IS_LEGACY: 242 return x * y * z 243 244 return x @ y @ z 245 246 247def mul4(w, x, y, z): 248 if IS_LEGACY: 249 return w * x * y * z 250 251 return w @ x @ y @ z 252 253def transform_inverse(m: mathutils.Matrix) -> mathutils.Matrix: 254 """Returns the inverse of a 4x4 transformation matrix 255 with the translation handled properly""" 256 inv_m = m.copy() 257 inv_m.translation = mathutils.Vector((0,0,0)) 258 inv_m.invert() 259 inv_m.translation = mul(inv_m.to_3x3(), -m.translation) 260 return inv_m 261 262 263CM_TO_BL_SPACE_MAT4 = mul( 264 bpy_extras.io_utils.axis_conversion(from_forward='Z', from_up='Y', to_forward='-Y', to_up='Z').to_4x4(), 265 mathutils.Matrix.Scale(-1, 4, (1, 0, 0)) 266) 267BL_TO_CM_SPACE_MAT4 = CM_TO_BL_SPACE_MAT4.inverted() 268CM_TO_BL_SPACE_QUAT = CM_TO_BL_SPACE_MAT4.to_quaternion() 269BL_TO_CM_SPACE_QUAT = BL_TO_CM_SPACE_MAT4.to_quaternion() 270def convert_cm_to_bl_space(x, lossless=True): 271 if type(x) == mathutils.Quaternion: 272 raise TypeError('Quaternion space conversions not supported') 273 elif lossless and type(x) == mathutils.Vector: 274 return mathutils.Vector((-x.x, -x.z, x.y)) 275 else: 276 return mul(CM_TO_BL_SPACE_MAT4, x) 277def convert_bl_to_cm_space(x, lossless=True): 278 if type(x) == mathutils.Quaternion: 279 raise TypeError('Quaternion space conversions not supported') 280 elif lossless and len(x) == 3: 281 return mathutils.Vector((-x[0], x[2], -x[1])) 282 else: 283 return mul(BL_TO_CM_SPACE_MAT4, x) 284def convert_cm_to_bl_local_space(x): 285 if type(x) == mathutils.Quaternion: 286 raise TypeError('Quaternion space conversions not supported') 287 else: 288 return mul(x, BL_TO_CM_SPACE_MAT4) 289def convert_bl_to_cm_local_space(x): 290 if type(x) == mathutils.Quaternion: 291 raise TypeError('Quaternion space conversions not supported') 292 else: 293 return mul(x, CM_TO_BL_SPACE_MAT4) 294 295 296CM_TO_BL_BONE_ROTATION_MAT4 = mul( 297 bpy_extras.io_utils.axis_conversion(from_forward='Z', from_up='-X', to_forward='Y', to_up='Z').to_4x4(), 298 mathutils.Matrix.Scale(-1, 4, (1, 0, 0)) 299) 300BL_TO_CM_BONE_ROTATION_MAT4 = CM_TO_BL_BONE_ROTATION_MAT4.inverted() 301CM_TO_BL_BONE_ROTATION_QUAT = CM_TO_BL_BONE_ROTATION_MAT4.to_quaternion() 302BL_TO_CM_BONE_ROTATION_QUAT = BL_TO_CM_BONE_ROTATION_MAT4.to_quaternion() 303def convert_cm_to_bl_bone_rotation(x): 304 if type(x) == mathutils.Quaternion: 305 raise TypeError('Quaternion space conversions not supported') 306 else: 307 return mul(x, CM_TO_BL_BONE_ROTATION_MAT4) 308def convert_bl_to_cm_bone_rotation(x): 309 if type(x) == mathutils.Quaternion: 310 raise TypeError('Quaternion space conversions not supported') 311 else: 312 return mul(x, BL_TO_CM_BONE_ROTATION_MAT4) 313 314 315#CM_TO_BL_BONE_SPACE_MAT4 = mul( 316# bpy_extras.io_utils.axis_conversion(from_forward='-X', from_up='Y', to_forward='Y', to_up='Z').to_4x4(), 317# mathutils.Matrix.Scale(-1, 4, (0, 0, 1)) 318#) 319CM_TO_BL_BONE_SPACE_MAT4 = CM_TO_BL_BONE_ROTATION_MAT4.inverted() 320BL_TO_CM_BONE_SPACE_MAT4 = CM_TO_BL_BONE_SPACE_MAT4.inverted() 321CM_TO_BL_BONE_SPACE_QUAT = CM_TO_BL_BONE_SPACE_MAT4.to_quaternion() 322BL_TO_CM_BONE_SPACE_QUAT = BL_TO_CM_BONE_SPACE_MAT4.to_quaternion() 323def convert_cm_to_bl_bone_space(x): 324 if type(x) == mathutils.Quaternion: 325 raise TypeError('Quaternion space conversions not supported') 326 else: 327 return mul(CM_TO_BL_BONE_SPACE_MAT4, x) 328def convert_bl_to_cm_bone_space(x): 329 if type(x) == mathutils.Quaternion: 330 raise TypeError('Quaternion space conversions not supported') 331 else: 332 return mul(BL_TO_CM_BONE_SPACE_MAT4, x) 333 334 335CM_TO_BL_WIDE_SLIDER_SPACE_MAT4 = mul( 336 bpy_extras.io_utils.axis_conversion(from_forward='X', from_up='Y', to_forward='Y', to_up='Z').to_4x4(), 337 mathutils.Matrix.Scale(-1, 4, (0, 1, 0)) 338) 339BL_TO_CM_WIDE_SLIDER_SPACE_MAT4 = CM_TO_BL_WIDE_SLIDER_SPACE_MAT4.inverted() 340CM_TO_BL_WIDE_SLIDER_SPACE_QUAT = CM_TO_BL_WIDE_SLIDER_SPACE_MAT4.to_quaternion() 341BL_TO_CM_WIDE_SLIDER_SPACE_QUAT = BL_TO_CM_WIDE_SLIDER_SPACE_MAT4.to_quaternion() 342def convert_cm_to_bl_wide_slider_space(x): 343 if type(x) == mathutils.Quaternion: 344 raise TypeError('Quaternion space conversions not supported') 345 else: 346 return mul(CM_TO_BL_WIDE_SLIDER_SPACE_MAT4, x) 347def convert_bl_to_cm_wide_slider_space(x): 348 if type(x) == mathutils.Quaternion: 349 raise TypeError('Quaternion space conversions not supported') 350 else: 351 return mul(BL_TO_CM_WIDE_SLIDER_SPACE_MAT4, x) 352 353 354CM_TO_BL_SLIDER_SPACE_MAT4 = bpy_extras.io_utils.axis_conversion(from_forward='X', from_up='Y', to_forward='Y', to_up='Z').to_4x4() 355BL_TO_CM_SLIDER_SPACE_MAT4 = CM_TO_BL_SLIDER_SPACE_MAT4.inverted() 356CM_TO_BL_SLIDER_SPACE_QUAT = CM_TO_BL_SLIDER_SPACE_MAT4.to_quaternion() 357BL_TO_CM_SLIDER_SPACE_QUAT = BL_TO_CM_SLIDER_SPACE_MAT4.to_quaternion() 358def convert_cm_to_bl_slider_space(x): 359 if type(x) == mathutils.Quaternion: 360 raise TypeError('Quaternion space conversions not supported') 361 else: 362 return mul(CM_TO_BL_SLIDER_SPACE_MAT4, x) 363def convert_bl_to_cm_slider_space(x): 364 if type(x) == mathutils.Quaternion: 365 raise TypeError('Quaternion space conversions not supported') 366 else: 367 return mul(BL_TO_CM_SLIDER_SPACE_MAT4, x) 368 369 370 371def set_bone_matrix(bone, mat): 372 bone.matrix = mat.copy() 373 #axis, angle = mat.to_quaternion().to_axis_angle() 374 #bone.roll = angle 375 if not IS_LEGACY and isinstance(bone, bpy.types.EditBone): 376 #print("Bone align_roll: ", (mat[0][0],mat[1][0],mat[2][0])) 377 bone.align_roll((mat[0][2],mat[1][2],mat[2][2])) 378 #print("bone: ", bone.matrix) 379 #print("mat: ", mat) 380 381 382BL28_TO_LEGACY_ICON = { 383 # Renamed in 2.80 384 'ADD' : 'ZOOMIN' , 385 'REMOVE' : 'ZOOMOUT' , 386 'FILE_NEW' : 'NEW' , 387 'SHADING_BBOX' : 'BBOX' , 388 'SHADING_TEXTURE' : 'POTATO' , #'TEXTURE_SHADED', 389 'SHADING_RENDERED' : 'SMOOTH' , 390 'SHADING_SOLID' : 'SOLID' , 391 'SHADING_WIRE' : 'WIRE' , 392 'XRAY' : 'ORTHO' , 393 'PROPERTIES' : 'BUTS' , 394 'IMAGE' : 'IMAGE_COL' , 395 'OUTLINER' : 'OOPS' , 396 'GRAPH' : 'IPO' , 397 'PREFERENCES' : 'SCRIPTWIN' , 398 'PIVOT_CURSOR' : 'CURSOR' , 399 'PIVOT_INDIVIDUAL' : 'ROTATECOLLECTION' , 400 'PIVOT_MEDIAN' : 'ROTATECENTER' , 401 'PIVOT_ACTIVE' : 'ROTACTIVE' , 402 'WINDOW' : 'FULLSCREEN' , 403 'LIGHT' : 'LAMP' , 404 'LIGHT_DATA' : 'LAMP_DATA' , 405 'OUTLINER_OB_LIGHT' : 'OUTLINER_OB_LAMP' , 406 'OUTLINER_DATA_LIGHT' : 'OUTLINER_DATA_LAMP' , 407 'LIGHT_POINT' : 'LAMP_POINT' , 408 'LIGHT_SUN' : 'LAMP_SUN' , 409 'LIGHT_SPOT' : 'LAMP_SPOT' , 410 'LIGHT_HEMI' : 'LAMP_HEMI' , 411 'LIGHT_AREA' : 'LAMP_AREA' , 412 'HIDE_OFF' : 'VISIBLE_IPO_ON' , 413 'HIDE_ON' : 'VISIBLE_IPO_OFF' , 414 415 # Added in 2.80 416 'ALEMBIC' : None , 417 'ALIGN_BOTTOM' : None , 418 'ALIGN_CENTER' : None , 419 'ALIGN_FLUSH' : None , 420 'ALIGN_JUSTIFY' : None , 421 'ALIGN_LEFT' : None , 422 'ALIGN_MIDDLE' : None , 423 'ALIGN_RIGHT' : None , 424 'ALIGN_TOP' : None , 425 'ASSET_MANAGER' : None , 426 'BOLD' : None , 427 'DECORATE' : None , 428 'DECORATE_ANIMATE' : None , 429 'DECORATE_DRIVER' : None , 430 'DECORATE_KEYFRAME' : None , 431 'DECORATE_LIBRARY_OVERRIDE' : None , 432 'DECORATE_LINKED' : None , 433 'DECORATE_LOCKED' : None , 434 'DECORATE_OVERRIDE' : None , 435 'DECORATE_UNLOCKED' : None , 436 'DRIVER_DISTANCE' : None , 437 'DRIVER_ROTATIONAL_DIFFERENCE' : None , 438 'DRIVER_TRANSFORM' : None , 439 'DUPLICATE' : None , 440 'FACE_MAPS' : None , 441 'FAKE_USER_OFF' : None , 442 'FAKE_USER_ON' : None , 443 'GP_MULTIFRAME_EDITING' : None , 444 'GP_ONLY_DSELECTED' : None , 445 'GP_SELECT_POINTS' : None , 446 'GP_SELECT_STROKES' : None , 447 'GREASEPENCIL' : None , 448 'HEART' : None , 449 'ITALIC' : None , 450 'LIBRARY_DATA_OVERRIDE' : None , 451 'LIGHTPROBE_CUBEMAP' : None , 452 'LIGHTPROBE_GRID' : None , 453 'LIGHTPROBE_PLANAR' : None , 454 'LINE_DATA' : None , 455 'MATCLOTH' : None , 456 'MATFLUID' : None , 457 'MATSHADERBALL' : None , 458 'MOD OPACITY' : None , 459 'MOD_HUE_SATURATION' : None , 460 'MOD_INSTANCE' : None , 461 'MOD_NOISE' : None , 462 'MOD_OFFSET' : None , 463 'MOD_PARTICLE_INSTANCE' : None , 464 'MOD_SIMPLIFY' : None , 465 'MOD_THICKNESS' : None , 466 'MOD_TIME' : None , 467 'MODIFIER_OFF' : None , 468 'MODIFIER_ON' : None , 469 'MOUSE_LMB' : None , 470 'MOUSE_LMB_DRAG' : None , 471 'MOUSE_MMB' : None , 472 'MOUSE_MMB_DRAG' : None , 473 'MOUSE_MOVE' : None , 474 'MOUSE_RMB' : None , 475 'MOUSE_RMB_DRAG' : None , 476 'NORMALS_FACE' : None , 477 'NORMALS_VERTEX' : 'MATCAP_23' , 478 'NORMALS_VERTEX_FACE' : 'MATCAP_23' , 479 'OBJECT_ORIGIN' : None , 480 'ONIONSKIN_OFF' : None , 481 'ONIONSKIN_ON' : None , 482 'ORIENTATION_GIMBAL' : None , 483 'ORIENTATION_GLOBAL' : None , 484 'ORIENTATION_LOCAL' : None , 485 'ORIENTATION_NORMAL' : None , 486 'ORIENTATION_VIEW' : None , 487 'OUTLINER_DATA_GREASEPENCIL' : None , 488 'OUTLINER_OB_IMAGE' : None , 489 'OUTLINER_OB_LIGHTPROBE' : None , 490 'OVERLAY' : None , 491 'PRESET' : None , 492 'PRESET_NEW' : None , 493 'SEALED' : None , 494 'SETTINGS' : None , 495 'SHADERFX' : None , 496 'SMALL_CAPS' : None , 497 'SYSTEM' : None , 498 'THREE_DOTS' : None , 499 'TOOL_SETTINGS' : None , 500 'TRACKING' : None , 501 502 # Other 503 #'ARROW_LEFTRIGHT' : 'MAN_SCALE' , 504 #'FILE_FOLDER' : 'FILESEL' , 505 #'FILEBROWSER' : 'FILESEL' , 506 #'FILE_IMAGE' : 'IMAGE_COL' , 507 #'MOD_DATA_TRANSFER' : 'RETOPO' , 508 #'BRUSH_SOFTEN' : 'MATCAP_19' , 509 #'CLIPUV_DEHLT' : 'MATCAP_24' , 510 #'MESH_CIRCLE' : 'MATCAP_24' , 511 #'VIS_SEL_01' : 'VISIBLE_IPO_OFF' , 512 #'VIS_SEL_11' : 'VISIBLE_IPO_ON' , 513 #'BRUSH_TEXFILL' : 'MATCAP_05' , 514 #'NODE_MATERIAL' : 'MATCAP_05' , 515 #'HOLDOUT_ON' : 'MATCAP_13' , 516} 517 518LEGACY_TO_BL28_ICON = { 519 # Renamed in 2.80 520 'ZOOMIN' : 'ADD' , 521 'ZOOMOUT' : 'REMOVE' , 522 'NEW' : 'FILE_NEW' , 523 'BBOX' : 'SHADING_BBOX' , 524 'POTATO' : 'SHADING_TEXTURE' , #'TEXTURE_SHADED', 525 'SMOOTH' : 'SHADING_RENDERED' , 526 'SOLID' : 'SHADING_SOLID' , 527 'WIRE' : 'SHADING_WIRE' , 528 'ORTHO' : 'XRAY' , 529 'BUTS' : 'PROPERTIES' , 530 'IMAGE_COL' : 'IMAGE' , 531 'OOPS' : 'OUTLINER' , 532 'IPO' : 'GRAPH' , 533 'SCRIPTWIN' : 'PREFERENCES' , 534 'CURSOR' : 'PIVOT_CURSOR' , 535 'ROTATECOLLECTION' : 'PIVOT_INDIVIDUAL' , 536 'ROTATECENTER' : 'PIVOT_MEDIAN' , 537 'ROTACTIVE' : 'PIVOT_ACTIVE' , 538 'FULLSCREEN' : 'WINDOW' , 539 'LAMP' : 'LIGHT' , 540 'LAMP_DATA' : 'LIGHT_DATA' , 541 'OUTLINER_OB_LAMP' : 'OUTLINER_OB_LIGHT' , 542 'OUTLINER_DATA_LAMP' : 'OUTLINER_DATA_LIGHT', 543 'LAMP_POINT' : 'LIGHT_POINT' , 544 'LAMP_SUN' : 'LIGHT_SUN' , 545 'LAMP_SPOT' : 'LIGHT_SPOT' , 546 'LAMP_HEMI' : 'LIGHT_HEMI' , 547 'LAMP_AREA' : 'LIGHT_AREA' , 548 'VISIBLE_IPO_ON' : 'HIDE_OFF' , 549 'VISIBLE_IPO_OFF' : 'HIDE_ON' , 550 551 # Removed in 2.80 552 'LINK_AREA' : 'LINKED' , 553 'PLUG' : 'PLUGIN' , 554 'EDIT' : None , 555 'GAME' : None , 556 'RADIO' : None , 557 'DOTSUP' : 'DOT' , 558 'DOTSDOWN' : 'DOT' , 559 'LINK' : 'LAYER_USED' , #(maybe use DOT, LAYER_ACTIVE or LAYER_USED) 560 'INLINK' : None , 561 'GO_LEFT' : None , 562 'TEMPERATURE' : None , 563 'SNAP_SURFACE' : None , 564 'MANIPUL' : None , 565 'BORDER_LASSO' : None , 566 'MAN_TRANS' : None , 567 'MAN_ROT' : None , 568 'MAN_SCALE' : None , 569 'RENDER_REGION' : None , 570 'RECOVER_AUTO' : None , 571 'SAVE_COPY' : None , 572 'OPEN_RECENT' : None , 573 'LOAD_FACTORY' : None , 574 'ALIGN' : None , 575 'SPACE2' : None , 576 'ROTATE' : None , 577 'SAVE_AS' : None , 578 'BORDER_RECT' : None , 579} 580 581def icon(key): 582 if IS_LEGACY: 583 # 対応アイコンがdictにない場合はNONEとする 584 return BL28_TO_LEGACY_ICON.get(key, key) or 'NONE' 585 else: 586 return LEGACY_TO_BL28_ICON.get(key, key) or 'NONE' 587 588 return key 589 590 591def region_type(): 592 if IS_LEGACY: 593 return 'TOOLS' 594 595 return 'UI' 596 597 598def pref_type(): 599 if IS_LEGACY: 600 return 'USER_PREFERENCES' 601 602 return 'PREFERENCES' 603 604 605def get_prefs(context): 606 if IS_LEGACY: 607 return context.user_preferences 608 609 return context.preferences 610 611 612def get_system(context): 613 if IS_LEGACY: 614 return get_prefs(context).system 615 616 return get_prefs(context).view 617 618 619def get_tex_image(context, node_name=None): 620 if IS_LEGACY: 621 if hasattr(context, 'texture'): 622 tex = context.texture 623 if tex: 624 return tex.image 625 else: 626 mate = context.material 627 if mate and mate.use_nodes: 628 node = mate.node_tree.nodes.get(node_name) 629 if node and node.type == 'TEX_IMAGE': 630 return node.image 631 632 return None 633 634 635 636# Property Subtypes 637# Blender 2.91 = [‘NONE’, ‘FILEPATH’ , ‘DIRPATH’ , ‘FILENAME’, ‘BYTESTRING’, ‘PASSWORD’, ‘PIXEL’, ‘UNSIGNED’, ‘PERCENTAGE’, ‘FACTOR’, ‘ANGLE’, ‘TIME’, ‘DISTANCE’, ‘DISTANCE_CAMERA’, ‘POWER’, ‘TEMPERATURE’, ‘COLOR’, ‘TRANSLATION’, ‘DIRECTION’, ‘VELOCITY’, ‘ACCELERATION’, ‘MATRIX’, ‘EULER’, ‘QUATERNION’, ‘AXISANGLE’, ‘XYZ’, ‘XYZ_LENGTH’, ‘COLOR_GAMMA’, ‘COORDS’ , ‘LAYER’, ‘LAYER_MEMBER’ ] 638# Blender 2.80 = [‘NONE’, ‘FILE_PATH’, ‘DIR_PATH’, ‘PIXEL’, ‘UNSIGNED’, ‘PERCENTAGE’, ‘FACTOR’, ‘ANGLE’, ‘TIME’, ‘DISTANCE’, ‘COLOR’, ‘TRANSLATION’, ‘DIRECTION’, ‘MATRIX’, ‘EULER’, ‘QUATERNION’, ‘XYZ’, ‘COLOR_GAMMA’, ‘COORDINATES’, ‘LAYER’, ‘LAYER_MEMBERSHIP’] 639# Blender 2.78 = [‘NONE’, ‘FILE_PATH’, ‘DIR_PATH’, ‘PIXEL’, ‘UNSIGNED’, ‘PERCENTAGE’, ‘FACTOR’, ‘ANGLE’, ‘TIME’, ‘DISTANCE’, ‘COLOR’, ‘TRANSLATION’, ‘DIRECTION’, ‘MATRIX’, ‘EULER’, ‘QUATERNION’, ‘XYZ’, ‘COLOR_GAMMA’, ‘COORDINATES’, ‘LAYER’, ‘LAYER_MEMBERSHIP’] 640 641BL29_TO_BL28_SUBTYPE = { 642 #'NONE' : 'NONE' , 643 'FILEPATH' : 'FILE_PATH' , 644 'DIRPATH' : 'DIR_PATH' , 645 'FILENAME' : None , 646 'BYTESTRING' : None , 647 'PASSWORD' : None , 648 #'PIXEL' : 'PIXEL' , 649 #'UNSIGNED' : 'UNSIGNED' , 650 #'PERCENTAGE' : 'PERCENTAGE' , 651 #'FACTOR' : 'FACTOR' , 652 #'ANGLE' : 'ANGLE' , 653 #'TIME' : 'TIME' , 654 #'DISTANCE' : 'DISTANCE' , 655 'DISTANCE_CAMERA' : 'DISTANCE' , 656 'POWER' : None , 657 'TEMPERATURE' : None , 658 #'COLOR' : 'COLOR' , 659 #'TRANSLATION' : 'TRANSLATION' , 660 #'DIRECTION' : 'DIRECTION' , 661 'VELOCITY' : 'XYZ' , 662 'ACCELERATION' : 'XYZ' , 663 #'MATRIX' : 'MATRIX' , 664 #'EULER' : 'EULER' , 665 #'QUATERNION' : 'QUATERNION' , 666 'AXISANGLE' : 'XYZ' , 667 #'XYZ' : 'XYZ' , 668 'XYZ_LENGTH' : 'XYZ' , 669 #'COLOR_GAMMA' : 'COLOR_GAMMA' , 670 'COORDS' : 'COORDINATES' , 671 #'LAYER' : 'LAYER' , 672 'LAYER_MEMBER' : 'LAYER_MEMBERSHIP', 673} 674 675def subtype(key): 676 if bpy.app.version < (2, 91): 677 return BL29_TO_BL28_SUBTYPE.get(key, key) or 'NONE' 678 return key 679 680 681# Property Units 682# Blender 2.91 = [‘NONE’, ‘LENGTH’, ‘AREA’, ‘VOLUME’, ‘ROTATION’, ‘TIME’, ‘VELOCITY’, ‘ACCELERATION’, ‘MASS’, ‘CAMERA’, ‘POWER’, ‘TEMPERATURE’] 683# Blender 2.80 = [‘NONE’, ‘LENGTH’, ‘AREA’, ‘VOLUME’, ‘ROTATION’, ‘TIME’, ‘VELOCITY’, ‘ACCELERATION’, ‘MASS’, ‘CAMERA’, ‘POWER’] 684# Blender 2.78 = [‘NONE’, ‘LENGTH’, ‘AREA’, ‘VOLUME’, ‘ROTATION’, ‘TIME’, ‘VELOCITY’, ‘ACCELERATION’, ‘CAMERA’] 685 686BL29_TO_LEGACY_UNIT = { 687 'MASS' : None, 688 'POWER' : None, 689 'TEMPERATURE' : None, 690} 691 692BL29_TO_BL28_UNIT = { 693 'TEMPERATURE' : None, 694} 695 696def unit(key): 697 if IS_LEGACY: 698 return BL29_TO_LEGACY_UNIT.get(key, key) or 'NONE' 699 elif bpy.app.version < (2, 91): 700 return BL29_TO_BL28_UNIT.get(key, key) or 'NONE' 701 return key
IS_LEGACY =
False
class
BlRegister:
17class BlRegister(): 18 idnames = set() 19 classes = [] 20 21 def __init__(self, *args, **kwargs): 22 self.make_annotation = kwargs.get('make_annotation', True) 23 self.use_bl_attr = kwargs.get('use_bl_attr', True) 24 self.only_legacy = kwargs.get('only_legacy', False) 25 self.only_latest = kwargs.get('only_latest', False) 26 27 def __call__(self, cls): 28 29 if hasattr(cls, 'bl_idname'): 30 bl_idname = cls.bl_idname 31 else: 32 if self.use_bl_attr: 33 bl_ctx = getattr(cls, 'bl_context', '') 34 bl_idname = f'{cls.bl_space_type}{cls.bl_region_type}{bl_ctx}{cls.bl_label}' 35 else: 36 bl_idname = cls.__qualname__ 37 38 if self.only_legacy: 39 if IS_LEGACY: 40 BlRegister.add(bl_idname, cls) 41 elif self.only_latest: 42 if IS_LEGACY is False: 43 BlRegister.add(bl_idname, cls) 44 else: 45 BlRegister.add(bl_idname, cls) 46 47 if self.make_annotation: 48 cls = make_annotations(cls) 49 50 if not IS_LEGACY and bpy.app.version >= (2, 93): 51 cls = make_prop_annotations(cls) 52 53 return cls 54 55 @classmethod 56 def add(cls: type, bl_idname: str, op_class: type) -> None: 57 if bl_idname in cls.idnames: 58 raise RuntimeError("Duplicate bl_idname: %s" % bl_idname) 59 60 cls.idnames.add(bl_idname) 61 cls.classes.append(op_class) 62 63 @classmethod 64 def register(cls): 65 for cls1 in cls.classes: 66 bpy.utils.register_class(cls1) 67 68 @classmethod 69 def unregister(cls): 70 for cls1 in reversed(cls.classes): 71 bpy.utils.unregister_class(cls1) 72 73 @classmethod 74 def cleanup(cls): 75 cls.classes.clear() 76 cls.idnames.clear()
idnames =
{'object.quick_hemi_bake_image', 'object.quick_bulge_bake_image', 'object.quick_density_bake_image', 'object.quick_dirty_bake_image', 'image.quick_export_cm3d2_tex', 'TEXTURE_MT_context_texture_values_OutlineWidth', 'CM3D2Menu', 'cm3d2menu.command_add', 'texture.reset_offset', 'cm3d2menu.export', 'text.paste_text_bone_data', 'text.show_text', 'anim.convert_to_cm3d2_interpolation', 'wm.show_cm3d2_converter_preference', 'armature.encode_cm3d2_bone_names', 'mesh.split_sharp', 'material.paste_material', 'object.quick_metal_bake_image', 'object.paste_armature_bone_data_property', 'object.change_base_shape_key', 'material.copy_material', 'object.precision_transfer_vertex_group', 'TEXTURE_MT_context_texture_values_RimPower', 'object.quick_blur_vertex_group', 'cm3d2menu.command_move', 'texture.reload_textures', 'geometry.attribute_from_custom_normals', 'object.quick_uv_border_bake_image', 'CNV_PG_cm3d2_bone_morph', 'wm.append_cm3d2_figure', 'object.quick_mesh_distance_bake_image', 'mesh.selected_face_sort_front', 'CM3D2MenuParam', 'import_anim.import_cm3d2_anm', 'cm3d2menu.align_selected_to_attach_point', 'DATA_PT_cm3d2_body_sliders', 'cm3d2_converter.dump_py_messages', 'object.quick_semen_bake_image', 'object.quick_gradation_bake_image', 'object.add_cm3d2_body_sliders', 'object.quick_ao_bake_image', 'import_mesh.import_cm3d2_model', 'object.cleanup_scale_bones', 'object.precision_shape_key_transfer', 'curve.hair_bunch_add', 'pose.apply_prime_field', 'object.save_cm3d2_body_sliders_to_menu', 'text.import_cm3d2_mate_text', 'mesh.remove_and_mark_doubles', 'object.remove_armature_bone_data_property', 'CM3D2MENU_UL_command_list', 'cm3d2menu.align_attach_point_to_selected', 'texture.setup_image_name', 'texture.reset_scale', 'object.forced_modifier_apply', 'object.quick_side_shadow_bake_image', 'CM3D2MenuMiscCommand', 'CM3D2PropertyMenuCommand', 'object.quick_transfer_vertex_group', 'object.blur_vertex_group', 'image.show_image', 'text.copy_text_bone_data', 'object.paste_object_bone_data_property', 'texture.set_default_toon_textures', 'PROPERTIESWINDOWCNV_SelectorItem', 'script.update_cm3d2_converter', 'object.encode_cm3d2_vertex_group_names', 'texture.sync_tex_color_ramps', 'material.import_cm3d2_mate', 'material.mateprop_expand', 'object.add_cm3d2_twist_bones', 'texture.set_color_value', 'cm3d2menu.command_remove', 'object.copy_object_bone_data_property', 'DATA_PT_cm3d2_sliders', 'MATERIAL_PT_cm3d2_properties', 'TEXTURE_MT_context_texture_values_normal', 'MISC_INFO_MT_add_cm3d2', 'object.quick_mesh_border_bake_image', 'TEXTURE_MT_texture_OutlineToonRamp', 'CNV_PG_cm3d2_wide_slider', 'cm3d2menu.import', 'CM3D2MenuAttachPointCommand', 'DATA_PT_cm3d2_wide_sliders', 'render.render_cm3d2_icon', 'CM3D2MenuCommandPointer', 'material.new_cm3d2', 'OBJECT_PT_cm3d2_menu', 'image.replace_cm3d2_tex', 'material.new_com3d2', 'object.add_bake_image', 'fcurve.convert_to_cm3d2_interpolation', 'object.align_to_cm3d2_base_bone', 'object.remove_noassign_vertex_groups', 'PROPERTIESWINDOWVertex Groups Selector', 'armature.decode_cm3d2_bone_names', 'export_anim.export_cm3d2_anm', 'CM3D2 Converter', 'object.blur_shape_key', 'PROPERTIESWINDOWCNV_UL_modifier_selector', 'object.multiply_vertex_group', 'TEXTURE_MT_context_texture_values_ZTest', 'material.decorate_material', 'object.decode_cm3d2_vertex_group_names', 'object.remove_object_bone_data_property', 'texture.auto_set_color_value', 'TEXTURE_MT_texture_ShadowRateToon', 'material.setup_mate_expand', 'mesh.selected_mesh_vertex_group_calculation', 'object.weighted_shape_key_transfer', 'texture.set_value', 'INFO_MT_help_CM3D2_Converter_RSS', 'pose.copy_prime_field', 'mesh.selected_mesh_vertex_group_blur', 'text.export_cm3d2_mate_text', 'cm3d2menu.param_add', 'image.export_cm3d2_tex', 'image.import_cm3d2_tex', 'texture.set_cm3d2path', 'object.quick_shadow_bake_image', 'object.quick_shape_key_transfer', 'text.remove_all_material_texts', 'cm3d2menu.param_remove', 'object.copy_armature_bone_data_property', 'object.sync_object_transform', 'object.quick_hair_bake_image', 'geometry.attribute_convert_normals', 'mesh.vertices_count_checker', 'object.copy_shape_key_values', 'material.export_cm3d2_mate', 'material.quick_texture_show', 'TEXTURE_MT_texture_ToonRamp', 'object.multiply_shape_key', 'export_mesh.export_cm3d2_model', 'cm3d2menu.param_move'}
classes =
[<class 'CM3D2 Converter.translations.CNV_OT_dump_py_messages'>, <class 'CM3D2 Converter.common.CNV_SelectorItem'>, <class 'CM3D2 Converter.model_export.CNV_OT_export_cm3d2_model'>, <class 'CM3D2 Converter.misc_OBJECT_PT_transform.CNV_OT_sync_object_transform'>, <class 'CM3D2 Converter.misc_OBJECT_PT_transform.CNV_OT_align_to_cm3d2_base_bone'>, <class 'CM3D2 Converter.model_import.CNV_OT_import_cm3d2_model'>, <class 'CM3D2 Converter.anm_import.CNV_OT_import_cm3d2_anm'>, <class 'CM3D2 Converter.misc_DOPESHEET_MT_editor_menus.CNV_OT_FCURVE_convert_to_cm3d2_interpolation'>, <class 'CM3D2 Converter.misc_DOPESHEET_MT_editor_menus.CNV_OT_ANIM_convert_to_cm3d2_interpolation'>, <class 'CM3D2 Converter.anm_export.CNV_OT_export_cm3d2_anm'>, <class 'CM3D2 Converter.tex_import.CNV_OT_import_cm3d2_tex'>, <class 'CM3D2 Converter.tex_export.CNV_OT_export_cm3d2_tex'>, <class 'CM3D2 Converter.mate_import.CNV_OT_import_cm3d2_mate'>, <class 'CM3D2 Converter.mate_import.CNV_OT_import_cm3d2_mate_text'>, <class 'CM3D2 Converter.mate_export.CNV_OT_export_cm3d2_mate'>, <class 'CM3D2 Converter.mate_export.CNV_OT_export_cm3d2_mate_text'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_CommandPointer'>, <class 'CM3D2 Converter.menu_file.MISCCOMMAND_PG_Param'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_AttachPointCommand'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_PropertyCommand'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_MiscCommand'>, <class 'CM3D2 Converter.menu_file.OBJECT_PG_CM3D2Menu'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_UL_command_list'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.OBJECT_PT_cm3d2_menu'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_import'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_export'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_command_add'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_command_remove'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_command_move'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_align_selected_to_attach_point'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_align_attach_point_to_selected'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_param_add'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_param_remove'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_param_move'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_decode_cm3d2_bone_names'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_encode_cm3d2_bone_names'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_copy_armature_bone_data_property'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_paste_armature_bone_data_property'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_remove_armature_bone_data_property'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_add_cm3d2_twist_bones'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_PG_cm3d2_bone_morph'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_PG_cm3d2_wide_slider'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_add_cm3d2_body_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.DATA_PT_cm3d2_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.DATA_PT_cm3d2_body_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.DATA_PT_cm3d2_wide_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_cleanup_scale_bones'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_save_cm3d2_body_sliders_to_menu'>, <class 'CM3D2 Converter.misc_DATA_PT_modifiers.CNV_UL_modifier_selector'>, <class 'CM3D2 Converter.misc_DATA_PT_modifiers.CNV_OT_forced_modifier_apply'>, <class 'CM3D2 Converter.misc_DATA_PT_vertex_groups.CNV_OT_decode_cm3d2_vertex_group_names'>, <class 'CM3D2 Converter.misc_DATA_PT_vertex_groups.CNV_OT_encode_cm3d2_vertex_group_names'>, <class 'CM3D2 Converter.misc_INFO_HT_header.CNV_OT_vertices_count_checker'>, <class 'CM3D2 Converter.misc_INFO_MT_add.misc_INFO_MT_add_cm3d2'>, <class 'CM3D2 Converter.misc_INFO_MT_add.CNV_OT_append_cm3d2_figure'>, <class 'CM3D2 Converter.misc_INFO_MT_curve_add.CNV_OT_hair_bunch_add'>, <class 'CM3D2 Converter.misc_INFO_MT_help.INFO_MT_help_CM3D2_Converter_RSS'>, <class 'CM3D2 Converter.misc_INFO_MT_help.CNV_OT_update_cm3d2_converter'>, <class 'CM3D2 Converter.misc_INFO_MT_help.CNV_OT_show_cm3d2_converter_preference'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.MATERIAL_PT_cm3d2_properties'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_new_cm3d2'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_new_com3d2'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_paste_material'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_copy_material'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_decorate_material'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_quick_texture_show'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_setup_material_expand'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_material_prop_expand'>, <class 'CM3D2 Converter.misc_MESH_MT_attribute_context_menu.CNV_OT_attribute_from_custom_normals'>, <class 'CM3D2 Converter.misc_MESH_MT_attribute_context_menu.CNV_OT_attribute_convert_normals'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_quick_shape_key_transfer'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_precision_shape_key_transfer'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_UL_vgroups_selector'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_weighted_shape_key_transfer'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_multiply_shape_key'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_blur_shape_key'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_change_base_shape_key'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_copy_shape_key_values'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_quick_transfer_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_precision_transfer_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_quick_blur_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_blur_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_multiply_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_remove_noassign_vertex_groups'>, <class 'CM3D2 Converter.misc_OBJECT_PT_context_object.CNV_OT_copy_object_bone_data_property'>, <class 'CM3D2 Converter.misc_OBJECT_PT_context_object.CNV_OT_paste_object_bone_data_property'>, <class 'CM3D2 Converter.misc_OBJECT_PT_context_object.CNV_OT_remove_object_bone_data_property'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_add_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_ao_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_dirty_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_hemi_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_shadow_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_side_shadow_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_gradation_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_metal_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_hair_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_uv_border_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_mesh_border_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_density_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_mesh_distance_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_bulge_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_semen_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_render.CNV_OT_render_cm3d2_icon'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_normal'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_OutlineWidth'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_RimPower'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_ZTest'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_show_image'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_replace_cm3d2_tex'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_sync_tex_color_ramps'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_default_toon_textures'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_reload_textures'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_auto_set_color_value'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_quick_export_cm3d2_tex'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_color_value'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_value'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_texture_reset_offset'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_texture_reset_scale'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_cm3d2path'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_setup_image_name'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_texture_ToonRamp'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_texture_ShadowRateToon'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_texture_OutlineToonRamp'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_show_text'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_copy_text_bone_data'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_paste_text_bone_data'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_remove_all_material_texts'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_edit_mesh_merge.CNV_OT_remove_and_mark_doubles'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_edit_mesh_specials.CNV_OT_selected_mesh_sort_front'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_edit_mesh_split.CNV_OT_split_sharp'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_pose_apply.CNV_OT_copy_prime_field'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_pose_apply.CNV_OT_apply_prime_field'>, <class 'CM3D2 Converter.misc_VIEW3D_PT_tools_weightpaint.CNV_OT_selected_mesh_vertex_group_blur'>, <class 'CM3D2 Converter.misc_VIEW3D_PT_tools_weightpaint.CNV_OT_selected_mesh_vertex_group_calculation'>, <class 'CM3D2 Converter.AddonPreferences'>]
def
make_prop_annotations(cls):
78def make_prop_annotations(cls): 79 if IS_LEGACY: 80 return cls 81 82 prop_type = bpy.props._PropertyDeferred 83 annotations = cls.__annotations__ if hasattr(cls, "__annotations__") else dict() 84 85 for prop_name in dir(cls): 86 prop = getattr(cls, prop_name) 87 if type(prop) != prop_type: 88 continue 89 annotations[prop_name] = prop 90 91 setattr(cls, "__annotations__", annotations) 92 #print(cls.__annotations__) 93 return cls
def
make_annotations(cls):
96def make_annotations(cls): 97 if IS_LEGACY: 98 return cls 99 100 cls_props = {} 101 for k, v in cls.__dict__.items(): 102 if isinstance(v, tuple): 103 cls_props[k] = v 104 105 annos = cls.__dict__.get('__annotations__') # type: dict[str, type] 106 if annos is None: 107 annos = {} 108 setattr(cls, '__annotations__', annos) 109 110 for k, v in cls_props.items(): 111 annos[k] = v 112 delattr(cls, k) 113 114 # 親クラスを辿ってアノテーションを生成 115 for bc in cls.__bases__: 116 # bpyのタイプやbuiltinsの場合はスキップ 117 if bc.__module__ in ['bpy_types', 'builtins']: 118 continue 119 make_annotations(bc) 120 121 return cls
def
layout_split(layout, factor=0.0, align=False):
def
get_active(context):
def
set_active(context, obj):
def
get_active_uv(me):
def
set_display_type(ob, disp_type):
def
get_select(obj: bpy_types.Object) -> bool:
def
set_select(obj: bpy_types.Object, select: bool) -> None:
def
is_select(*args) -> bool:
180def is_select(*args) -> bool: 181 """すべてが選択状態であるかを判定する.""" 182 if IS_LEGACY: 183 return all(arg.select for arg in args) 184 185 return all(arg.select_get() for arg in args)
すべてが選択状態であるかを判定する.
def
get_hide(obj: bpy_types.Object) -> bool:
def
set_hide(obj: bpy_types.Object, hide: bool):
def
link(scene: bpy.types.Scene, obj: bpy_types.Object):
def
unlink(scene: bpy.types.Scene, obj: bpy_types.Object):
def
get_cursor_loc(context):
def
get_lights(blend_data):
def
mul(x, y):
def
mul3(x, y, z):
def
mul4(w, x, y, z):
def
transform_inverse(m: Matrix) -> Matrix:
254def transform_inverse(m: mathutils.Matrix) -> mathutils.Matrix: 255 """Returns the inverse of a 4x4 transformation matrix 256 with the translation handled properly""" 257 inv_m = m.copy() 258 inv_m.translation = mathutils.Vector((0,0,0)) 259 inv_m.invert() 260 inv_m.translation = mul(inv_m.to_3x3(), -m.translation) 261 return inv_m
Returns the inverse of a 4x4 transformation matrix with the translation handled properly
CM_TO_BL_SPACE_MAT4 =
Matrix(((-1.0, 0.0, 0.0, 0.0),
(0.0, 0.0, -1.0, 0.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_SPACE_MAT4 =
Matrix(((-1.0, 0.0, -0.0, 0.0),
(0.0, -0.0, 1.0, -0.0),
(-0.0, -1.0, -0.0, 0.0),
(0.0, -0.0, -0.0, 1.0)))
CM_TO_BL_SPACE_QUAT =
Quaternion((0.7071068286895752, -0.7071068286895752, 0.0, 0.0))
BL_TO_CM_SPACE_QUAT =
Quaternion((0.7071068286895752, 0.7071068286895752, 0.0, 0.0))
def
convert_cm_to_bl_space(x, lossless=True):
271def convert_cm_to_bl_space(x, lossless=True): 272 if type(x) == mathutils.Quaternion: 273 raise TypeError('Quaternion space conversions not supported') 274 elif lossless and type(x) == mathutils.Vector: 275 return mathutils.Vector((-x.x, -x.z, x.y)) 276 else: 277 return mul(CM_TO_BL_SPACE_MAT4, x)
def
convert_bl_to_cm_space(x, lossless=True):
def
convert_cm_to_bl_local_space(x):
def
convert_bl_to_cm_local_space(x):
CM_TO_BL_BONE_ROTATION_MAT4 =
Matrix(((0.0, -1.0, 0.0, 0.0),
(0.0, 0.0, 1.0, 0.0),
(1.0, 0.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_BONE_ROTATION_MAT4 =
Matrix(((-0.0, 0.0, 1.0, 0.0),
(-1.0, -0.0, 0.0, -0.0),
(-0.0, 1.0, -0.0, 0.0),
(0.0, -0.0, 0.0, 1.0)))
CM_TO_BL_BONE_ROTATION_QUAT =
Quaternion((0.5, 0.5, 0.5, -0.5))
BL_TO_CM_BONE_ROTATION_QUAT =
Quaternion((0.5, -0.5, -0.5, 0.5))
def
convert_cm_to_bl_bone_rotation(x):
def
convert_bl_to_cm_bone_rotation(x):
CM_TO_BL_BONE_SPACE_MAT4 =
Matrix(((-0.0, 0.0, 1.0, 0.0),
(-1.0, -0.0, 0.0, -0.0),
(-0.0, 1.0, -0.0, 0.0),
(0.0, -0.0, 0.0, 1.0)))
BL_TO_CM_BONE_SPACE_MAT4 =
Matrix(((-0.0, -1.0, -0.0, 0.0),
(0.0, -0.0, 1.0, -0.0),
(1.0, 0.0, -0.0, 0.0),
(0.0, -0.0, 0.0, 1.0)))
CM_TO_BL_BONE_SPACE_QUAT =
Quaternion((0.5, -0.5, -0.5, 0.5))
BL_TO_CM_BONE_SPACE_QUAT =
Quaternion((0.5, 0.5, 0.5, -0.5))
def
convert_cm_to_bl_bone_space(x):
def
convert_bl_to_cm_bone_space(x):
CM_TO_BL_WIDE_SLIDER_SPACE_MAT4 =
Matrix(((0.0, 0.0, 1.0, 0.0),
(1.0, 0.0, 0.0, 0.0),
(0.0, -1.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_WIDE_SLIDER_SPACE_MAT4 =
Matrix(((-0.0, 1.0, -0.0, 0.0),
(0.0, -0.0, -1.0, -0.0),
(1.0, 0.0, -0.0, 0.0),
(0.0, -0.0, 0.0, 1.0)))
CM_TO_BL_WIDE_SLIDER_SPACE_QUAT =
Quaternion((0.5, 0.5, -0.5, -0.5))
BL_TO_CM_WIDE_SLIDER_SPACE_QUAT =
Quaternion((0.5, -0.5, 0.5, 0.5))
def
convert_cm_to_bl_wide_slider_space(x):
def
convert_bl_to_cm_wide_slider_space(x):
CM_TO_BL_SLIDER_SPACE_MAT4 =
Matrix(((0.0, 0.0, 1.0, 0.0),
(1.0, 0.0, 0.0, 0.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_SLIDER_SPACE_MAT4 =
Matrix(((0.0, 1.0, 0.0, -0.0),
(-0.0, 0.0, 1.0, 0.0),
(1.0, -0.0, 0.0, -0.0),
(-0.0, 0.0, -0.0, 1.0)))
CM_TO_BL_SLIDER_SPACE_QUAT =
Quaternion((0.5, 0.5, 0.5, 0.5))
BL_TO_CM_SLIDER_SPACE_QUAT =
Quaternion((0.5, -0.5, -0.5, -0.5))
def
convert_cm_to_bl_slider_space(x):
def
convert_bl_to_cm_slider_space(x):
def
set_bone_matrix(bone, mat):
372def set_bone_matrix(bone, mat): 373 bone.matrix = mat.copy() 374 #axis, angle = mat.to_quaternion().to_axis_angle() 375 #bone.roll = angle 376 if not IS_LEGACY and isinstance(bone, bpy.types.EditBone): 377 #print("Bone align_roll: ", (mat[0][0],mat[1][0],mat[2][0])) 378 bone.align_roll((mat[0][2],mat[1][2],mat[2][2])) 379 #print("bone: ", bone.matrix) 380 #print("mat: ", mat)
BL28_TO_LEGACY_ICON =
{'ADD': 'ZOOMIN', 'REMOVE': 'ZOOMOUT', 'FILE_NEW': 'NEW', 'SHADING_BBOX': 'BBOX', 'SHADING_TEXTURE': 'POTATO', 'SHADING_RENDERED': 'SMOOTH', 'SHADING_SOLID': 'SOLID', 'SHADING_WIRE': 'WIRE', 'XRAY': 'ORTHO', 'PROPERTIES': 'BUTS', 'IMAGE': 'IMAGE_COL', 'OUTLINER': 'OOPS', 'GRAPH': 'IPO', 'PREFERENCES': 'SCRIPTWIN', 'PIVOT_CURSOR': 'CURSOR', 'PIVOT_INDIVIDUAL': 'ROTATECOLLECTION', 'PIVOT_MEDIAN': 'ROTATECENTER', 'PIVOT_ACTIVE': 'ROTACTIVE', 'WINDOW': 'FULLSCREEN', 'LIGHT': 'LAMP', 'LIGHT_DATA': 'LAMP_DATA', 'OUTLINER_OB_LIGHT': 'OUTLINER_OB_LAMP', 'OUTLINER_DATA_LIGHT': 'OUTLINER_DATA_LAMP', 'LIGHT_POINT': 'LAMP_POINT', 'LIGHT_SUN': 'LAMP_SUN', 'LIGHT_SPOT': 'LAMP_SPOT', 'LIGHT_HEMI': 'LAMP_HEMI', 'LIGHT_AREA': 'LAMP_AREA', 'HIDE_OFF': 'VISIBLE_IPO_ON', 'HIDE_ON': 'VISIBLE_IPO_OFF', 'ALEMBIC': None, 'ALIGN_BOTTOM': None, 'ALIGN_CENTER': None, 'ALIGN_FLUSH': None, 'ALIGN_JUSTIFY': None, 'ALIGN_LEFT': None, 'ALIGN_MIDDLE': None, 'ALIGN_RIGHT': None, 'ALIGN_TOP': None, 'ASSET_MANAGER': None, 'BOLD': None, 'DECORATE': None, 'DECORATE_ANIMATE': None, 'DECORATE_DRIVER': None, 'DECORATE_KEYFRAME': None, 'DECORATE_LIBRARY_OVERRIDE': None, 'DECORATE_LINKED': None, 'DECORATE_LOCKED': None, 'DECORATE_OVERRIDE': None, 'DECORATE_UNLOCKED': None, 'DRIVER_DISTANCE': None, 'DRIVER_ROTATIONAL_DIFFERENCE': None, 'DRIVER_TRANSFORM': None, 'DUPLICATE': None, 'FACE_MAPS': None, 'FAKE_USER_OFF': None, 'FAKE_USER_ON': None, 'GP_MULTIFRAME_EDITING': None, 'GP_ONLY_DSELECTED': None, 'GP_SELECT_POINTS': None, 'GP_SELECT_STROKES': None, 'GREASEPENCIL': None, 'HEART': None, 'ITALIC': None, 'LIBRARY_DATA_OVERRIDE': None, 'LIGHTPROBE_CUBEMAP': None, 'LIGHTPROBE_GRID': None, 'LIGHTPROBE_PLANAR': None, 'LINE_DATA': None, 'MATCLOTH': None, 'MATFLUID': None, 'MATSHADERBALL': None, 'MOD OPACITY': None, 'MOD_HUE_SATURATION': None, 'MOD_INSTANCE': None, 'MOD_NOISE': None, 'MOD_OFFSET': None, 'MOD_PARTICLE_INSTANCE': None, 'MOD_SIMPLIFY': None, 'MOD_THICKNESS': None, 'MOD_TIME': None, 'MODIFIER_OFF': None, 'MODIFIER_ON': None, 'MOUSE_LMB': None, 'MOUSE_LMB_DRAG': None, 'MOUSE_MMB': None, 'MOUSE_MMB_DRAG': None, 'MOUSE_MOVE': None, 'MOUSE_RMB': None, 'MOUSE_RMB_DRAG': None, 'NORMALS_FACE': None, 'NORMALS_VERTEX': 'MATCAP_23', 'NORMALS_VERTEX_FACE': 'MATCAP_23', 'OBJECT_ORIGIN': None, 'ONIONSKIN_OFF': None, 'ONIONSKIN_ON': None, 'ORIENTATION_GIMBAL': None, 'ORIENTATION_GLOBAL': None, 'ORIENTATION_LOCAL': None, 'ORIENTATION_NORMAL': None, 'ORIENTATION_VIEW': None, 'OUTLINER_DATA_GREASEPENCIL': None, 'OUTLINER_OB_IMAGE': None, 'OUTLINER_OB_LIGHTPROBE': None, 'OVERLAY': None, 'PRESET': None, 'PRESET_NEW': None, 'SEALED': None, 'SETTINGS': None, 'SHADERFX': None, 'SMALL_CAPS': None, 'SYSTEM': None, 'THREE_DOTS': None, 'TOOL_SETTINGS': None, 'TRACKING': None}
LEGACY_TO_BL28_ICON =
{'ZOOMIN': 'ADD', 'ZOOMOUT': 'REMOVE', 'NEW': 'FILE_NEW', 'BBOX': 'SHADING_BBOX', 'POTATO': 'SHADING_TEXTURE', 'SMOOTH': 'SHADING_RENDERED', 'SOLID': 'SHADING_SOLID', 'WIRE': 'SHADING_WIRE', 'ORTHO': 'XRAY', 'BUTS': 'PROPERTIES', 'IMAGE_COL': 'IMAGE', 'OOPS': 'OUTLINER', 'IPO': 'GRAPH', 'SCRIPTWIN': 'PREFERENCES', 'CURSOR': 'PIVOT_CURSOR', 'ROTATECOLLECTION': 'PIVOT_INDIVIDUAL', 'ROTATECENTER': 'PIVOT_MEDIAN', 'ROTACTIVE': 'PIVOT_ACTIVE', 'FULLSCREEN': 'WINDOW', 'LAMP': 'LIGHT', 'LAMP_DATA': 'LIGHT_DATA', 'OUTLINER_OB_LAMP': 'OUTLINER_OB_LIGHT', 'OUTLINER_DATA_LAMP': 'OUTLINER_DATA_LIGHT', 'LAMP_POINT': 'LIGHT_POINT', 'LAMP_SUN': 'LIGHT_SUN', 'LAMP_SPOT': 'LIGHT_SPOT', 'LAMP_HEMI': 'LIGHT_HEMI', 'LAMP_AREA': 'LIGHT_AREA', 'VISIBLE_IPO_ON': 'HIDE_OFF', 'VISIBLE_IPO_OFF': 'HIDE_ON', 'LINK_AREA': 'LINKED', 'PLUG': 'PLUGIN', 'EDIT': None, 'GAME': None, 'RADIO': None, 'DOTSUP': 'DOT', 'DOTSDOWN': 'DOT', 'LINK': 'LAYER_USED', 'INLINK': None, 'GO_LEFT': None, 'TEMPERATURE': None, 'SNAP_SURFACE': None, 'MANIPUL': None, 'BORDER_LASSO': None, 'MAN_TRANS': None, 'MAN_ROT': None, 'MAN_SCALE': None, 'RENDER_REGION': None, 'RECOVER_AUTO': None, 'SAVE_COPY': None, 'OPEN_RECENT': None, 'LOAD_FACTORY': None, 'ALIGN': None, 'SPACE2': None, 'ROTATE': None, 'SAVE_AS': None, 'BORDER_RECT': None}
def
icon(key):
def
region_type():
def
pref_type():
def
get_prefs(context):
def
get_system(context):
def
get_tex_image(context, node_name=None):
620def get_tex_image(context, node_name=None): 621 if IS_LEGACY: 622 if hasattr(context, 'texture'): 623 tex = context.texture 624 if tex: 625 return tex.image 626 else: 627 mate = context.material 628 if mate and mate.use_nodes: 629 node = mate.node_tree.nodes.get(node_name) 630 if node and node.type == 'TEX_IMAGE': 631 return node.image 632 633 return None
BL29_TO_BL28_SUBTYPE =
{'FILEPATH': 'FILE_PATH', 'DIRPATH': 'DIR_PATH', 'FILENAME': None, 'BYTESTRING': None, 'PASSWORD': None, 'DISTANCE_CAMERA': 'DISTANCE', 'POWER': None, 'TEMPERATURE': None, 'VELOCITY': 'XYZ', 'ACCELERATION': 'XYZ', 'AXISANGLE': 'XYZ', 'XYZ_LENGTH': 'XYZ', 'COORDS': 'COORDINATES', 'LAYER_MEMBER': 'LAYER_MEMBERSHIP'}
def
subtype(key):
BL29_TO_LEGACY_UNIT =
{'MASS': None, 'POWER': None, 'TEMPERATURE': None}
BL29_TO_BL28_UNIT =
{'TEMPERATURE': None}
def
unit(key):